#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define HTSIZE 9997
typedef int (*func)(int,int);

typedef struct _hashData{
    float R;
    /*
    int Long;
    int Short;
    */
    int Count;
} hashData;

typedef struct _hashNode{
    hashData Data;
    struct _hashNode *Next;
} hashNode;

typedef struct _hashTable{
    hashNode **HN;
    int Size;
    func HashFunc;
} hashTable;

int hashFunc(int l,int s);
hashTable* hashTableCreate(int,func);
hashNode* find(hashTable*,int,int);
void add(hashTable*,int,int);
bool squareMatch(int,int,int,int);
float Radio(int ,int);

float Radio(int w,int h){
    return ((float)w)/h;
}

int hashFunc(int w,int h){
    long r=(65537*w)/h;
    return r%HTSIZE;
}

hashTable* hashTableCreate(int size,func f){
    hashTable *h=malloc(sizeof(hashTable));
    h->Size=HTSIZE;
    h->HashFunc=f;
    h->HN=(hashNode**)malloc(sizeof(hashNode*)*HTSIZE);
    for(int i=0; i<h->Size; i++){
        h->HN[i]=NULL;
    }
    return h;
}
hashNode* find(hashTable* ht,int w,int h){
    int r=ht->HashFunc(w,h);
    hashNode *hn=ht->HN[r];
    while( hn ){
        if( Radio(w,h) - hn->Data.R <= 1e-5 ){
                return hn;
        }
        hn=hn->Next;
    }
    return NULL;
}
void add(hashTable* ht,int w,int h){
    int r=ht->HashFunc(w,h);
    hashNode *new=malloc(sizeof(hashNode));
    new->Data.R=((float)w)/h;
    new->Data.Count=1;
    new->Next=ht->HN[r];
    ht->HN[r]=new;
    return ;
}

long long interchangeableRectangles(int** rectangles, int rectanglesSize, int* rectanglesColSize) {
    int (*rect)[2]=(int (*)[2])rectangles;
    long long r=0;
    hashTable *h=hashTableCreate( HTSIZE, hashFunc );
    hashNode *tmp=NULL;
    for(int i=0; i<rectanglesSize; i++ ){
        tmp=find(h,rect[i][0],rect[i][1]);
        if( tmp ) {
            printf("found\n");
            r+=(tmp->Data.Count)++;
        }
        else {
            add(h,rect[i][0],rect[i][1]);
        }
    }
    return r;
}

int main(){
    int r[4][2]={{4,8},{3,6},{10,20},{15,30}};
//        int r[2][2]={{4,5},{7,8}};
//    hashTable *h=hashTableCreate( HTSIZE, hashFunc );
    printf("%lld\n",interchangeableRectangles((int**)r,4,NULL));
    return 0;
}
